perm filename ARM.NEW[UP,DOC] blob
sn#070174 filedate 1973-11-05 generic text, type T, neo UTF8
00100 GENERAL
00200 The arm has six degrees of freedom corresponding to 6 joints. The
00300 joints are numbered from 1 to 6 starting at the shoulder and moving
00400 out to the hand. All rotary joint angles are measured in degrees.
00500 Joint 3 which is linear is measured in inches.
00600
00700 The coordinate system is referenced to the table top with the table
00800 lying in the x y plane at z=0 with the z axis pointing vertically up.
00900 The origin is at the corner of the table. The base of the arm is at
01000 20,10 approximately.
01100
01200 The Arm is normally controlled by specifying what happens to the
01300 hand. The program checks that the hand will not intersect the table.
01400
01500 On the finger tips are two touch sensors which can interrupt arm
01600 operation.
01700
01800 The program which runs the arm is in the form of an interpreter and
01900 works in two basic modes: Planning and Execution. In the planning
02000 mode arm functions are assembled into a data file which may then be
02100 executed by a "DO" command. Functions may be immediately executed by
02200 prefixing the function call by "DO". For example.
02300
02400 OPEN 3
02500 PARK
02600 DO
02700
02800 will cause a data file to be constructed, either on the 3330 as a
02900 file WAVE.TRJ or on the Swapping disk, containing the two functions
03000 open the hand to 3 inches and then move to the park position. These
03100 two commands are then executed by the DO.
03200
03300 DO OPEN 3
03400 DO PARK
03500
03600 This will have the same effect except that the planning program will
03700 be activated between each function call, which is very time
03800 consumming.
03900
04000 It is possible to write symbolic programs either in the form of
04100 macros using the "DEFINE" pseudo op, or by creating a text file and
04200 reading it in by a "REQUIRE" pseudo op.
04300
04400 What follows is a list of the Functions, Errors and how to run the
04500 arm.
04600
04700
00100 DO <function> | DO <program> | DO
00200 If DO is followed by a function then that function will be executed.
00300 This does not change the state of any program being compiled.
00400 Otherwise the <id> following the DO is taken as the program name. If
00500 DO is terminated by a C/R then the default program is executed. If
00600 this does not exist the servo will return an error status 3. The
00700 default program name is that last set by FILE this is changed by
00800 DOing another program, in which case its program name becomes the
00900 default, or by a BEGIN pseudo op.
01000
01100 REQUIRE <file spec>
01200 This causes the input scanner to read from the designated file. When
01300 an EOF is encountered scan returns to the TTY. <file spec>::= <file
01400 name>.<ext>[pppn] where if <ext> is null then HAL is used and if
01500 [pppn] is missing the running pppn is assumed.
01600
01700 DUMP <file spec>
01800 This causes a file to be opened and all transforms, vectors and
01900 macros are written out in symbolic form. It is the opposite to
02000 REQUIRE. If a file already exists, of the same name, it is
02100 over-written!!!
02200
02300 TRANS <id>
02400 <X> <Y> <Z> <O> <A> <T>
02500 This pseudo op is on two lines and is used to set up a 4x4
02600 transformation and to identify it with an <id>. The <X> <Y> and <Z>
02700 specify the position of a point centrally located between the finger
02800 tips in table coordinates. <O> <A> and <T> specify the orientation of
02900 the hand. with all three angles (in degrees) zero the hand points in
03000 the negative "y" direction with the fingers in a horizontal plane.
03100 the orientation vector which points from one finger tip to the other
03200 is aligned along the "x" axis. <O> specifies a rotation of the
03300 orientation vector about a vertical direction; thus at <O>=90 degrees
03400 the hand still horizontal would point along the positive "x"
03500 direction. <A> is a rotation about the orientation vector. With
03600 <A>=90 degrees the hand always points straight down. <T> is a final
03700 rotation about the axis of the wrist and corresponds to a rotation of
03800 the final joint. When talking to the interpreter directly from the
03900 TTY only as many parameters that have changed need to be retyped.
04000 Further a delimiter (which includes a space) indicates that the
04100 parameter is to remain unchanged. For example to change the <Z>
04200 parameter only one types
04300 TRANS <id>
04400 <space><space><Z>C/R.
04500
04600 VECT <id>
04700 <X> <Y> <Z>
04800 This is similar to TRANS except that it sets up vectors. There are
04900 four predeclared vectors X,Y,Z,and NIL the null vector.
05000
05100 BEGIN <id>
05200 This pseudo op starts a program of name <id>. If this pseudo op is
05300 not given before any instruction then a default BEGIN <default name>
05400 is automatically generated.
05500
05600 END
05700 This closes the trajectory file. If a program has not been ENDed
05800 before a DO <program> is executed an automatic END is performed.
05900
06000 WAIT
06100 Causes the arm to stop at the corresponding point during execution.
06200 Execution may be resumed (after executing any number of functions) by
06300 a proceed command.
06400
06500 P <integer>
06600 this causes the arm to proceed from a wait or an error state, if the
06700 argument is non zero execution proceeds with the last or current
06800 instruction, otherwise from the next instruction.
06900
07000 FILE <id>
07100 This changes the default file name to <id>. It is initially set at
07200 WAVE.
07300
07400 WHERE
07500 This causes the arm's position to be read and the position to be
07600 typed out. This function is automatically executed when the program
07700 is started. It should only be executed if the arm has been moved
07800 manually.
07900
08100 HERE <trans> | HERE <trans> <dx> <fac> <axis> <deg>
08200 This is like TRANS except that the hands position is read as in WHERE
08300 to give the initial position for the transform <id>. Its main use is
08400 in defining positions by moving the hand and then creating a
08500 transform to represent the present position. In the second form the
08600 the value of the transform is such that when the vector <dx> scaled
08700 by <fac> is added to it and the transform is rotated about <axis>
08800 <deg> degrees the current hand position is obtained.
08900
00100 PARK
00200 Generates a trajectory to the PARK position, which has joint angles
00300 -180, -90, 14, -90, 90, 0
00400
00500 GOTO <trans> | GOTO <trans> <dx> <fac> <axis> <deg>
00600 Generates a three part trajectory to either <trans> or in the second
00700 case to <trans> rotated about a vector <axis>, <deg> degrees and
00800 translated an additional vector <dx> scaled by <fac>.
01800
01810 GO <trans> | GO <trans> <dx> <fac> <axis> <deg>
01832 This is the same as GOTO except that it is a one part direct move
01854 with no lift off or set down.
01876
01900 MOVE <trans> | MOVE <trans> <dx> <fac> <axis> <deg>
02000 This is the same as GOTO except that a smooth trajectory is fitted
02100 through the three positions.
02200
02300 DRAW <pos> <rot> <angle> <crank> <axis> <deg> <time> <loop>
02400 This is a controlled motion of the hand. The hand is moved to its
02500 present position plus the vector <pos>. As it moves the hand is
02600 rotated about a vector <rot>, <angle> degrees. If <crank> is not null
02700 then the hand is assumed to be attached to a crank which is the
02800 initial position + <crank> and as the first motion is executed the
02900 hand attached to the end of the crank is rotated about an axis <axis>
03000 <deg> degrees. If loop is non zero and the initial and final
03100 positions are the same the loop motion may be repeated continuously
03200 <loop> times. The entire motion takes <time> jiffies. A jiffy is 1/60
03300 th. second.
03400
03500 CHANGE <dx> <fac> <rot> <deg> <time>
03600 This causes a differential motion of vector <dx> scaled by <fac> and
03700 simultaneously the hand rotated about a vector <rot>, <deg> degrees.
03800 If <time> > 0 then the motion shall take <time> jiffies.
03900
04000 DRIVE <joint> <dist> <time>
04100 This causes joint <joint>(1 is the root joint -- 6 is the hand) to be
04200 driven <dist> degrees, or in the case of joint 3 ---inches, in a
04300 minimum time <time>. All other joints brakes remain on unless free
04400 joints are also specified.
04500
04600 PLACE
04700 This causes the hand to move down until it meets some resistance.
00100 OPEN <dist>
00200 This causes the hand to be opened or closed until the opening between
00300 the fingers is <dist>, it gives up after about 4 seconds and returns
00400 error 22 if it is unable to comply.
00500
00600 CLOSE <dist>
00700 This always closes the hand until it meets some resistance. It then
00800 checks that the opening of the hand is greater than <dist>. If it is
00900 less it returns error 2. This is useful in checking that the hand is
01000 holding something.
01100
01200 CENTER <dist>
01300 This is the same as CLOSE except that the hand is driven to close
01400 centrally over the object using touch.
01500
01600 SCREW <vel>
01700 This instruction will drive the tool at velocity <vel> (maximum =63).
01800 It must be MERGEd with some arm motion.
01900 i.e.
02000 SCREW 27
02100 MERGE
02200 CHANGE REACH 1 NIL 0 100
02300 While the hand reaches one inch the tool will drive at velocity 27.
02400 Normally FREE joints would also be specified together with some
02500 STOPping constraint. Note NIL, of zero value, is the only other
02600 predeclared vector.
02700
00100 FREE <n> <f1> ... <fn>
00200 For each of the <n> direction vectors <fn> joints of the arm are
00300 freed during the next arm motion. These joints have gravity
00400 compensation, additional forces and acceleration compensation but no
00500 position sensitive feedback. The vectors <fn> specify directions in
00600 table coordinates.
00700
00800 For example.
00900
01400 FREE 2 X Y
01500 CHANGE Z -1 NIL 0 100
01600
01700 Would provide for free motion in the x and y direction while the hand
01800 moves down 1 inch for the next 100 jiffies.
01900
02000 SPIN <n> <f1> ... <fn>
02100 For each of the <n> axis vectors <fn> joints of the arm are freed as
02200 in FREE.
02300
02400 FORCE <fv> <mv>
02500 During the next arm motion additional predicted joint torques will be
02600 applied such as to exert a force <fv> and moment <mv> at the hand.
02700
02800 For example.
02900
03200 FREE 1 Z
03300 VECT F
03400 0 0 -50
03500 FORCE F NIL
03600 CHANGE NIL 0 NIL 0 100
03700
03800 This would provide for a direction of free motion in the z direction
03900 while exerting a force of 50 oz. straight down. i.e. the hand will
04000 push down at 50 oz foe the next 100 jiffies.
04100
04200 STOP <fv> <mv>
04300 If during the next arm motion the force and moment at the hand exceed
04400 <fv> and <mv> the arm will stop. If such a condition is not meet
04500 during the motion an error 23 will be returned.
04600
04700 WOBBLE <deg>
04800 This causes the outer three joints to be modulated with a sine wave
04900 of amplitude <deg> degrees.
05000
05100 NNUL
05200 At the end of the next motion do not wait to null out joint errors
05300 but stop the arm immediately.
05400
05500
05600
05700
00100 CONO <arrive> <depart> <k> <ts> <tm> <weight>
00200 This function executed immediately before any motion instruction is
00300 used to modify the performance of that motion. All motions start at
00400 an initial position move to a position given by initial + <depart>
00500 where <depart> is a vector which is always restored to 0,0,3 after
00600 each motion instruction. The arm then moves to a position given by
00700 final + <arrive> where arrive is similar to <depart>, and then to the
00800 final position. In the case of PARK <arrive> is set to null. A
00900 vector <k> is used to specify the radii of gyration of the object
01000 held in the hand. the x axis is along the direction normal to the
01100 plane of the fingers. the y direction is along the direction of the
01200 orientation vector (between the finger tips). and the z direction is
01300 along the fingers. The weight of the object is given in <weight> in
01400 ounces. <ts> is the minimum time in jiffies (1/60 second) for the
01500 initial and final parts of the trajectory, and <tm> is the minimum
01600 time for the mid part. non zero times are used to slow down arm
01700 motions.
01800
01900 MERGE
02000 This function if executed before a motion instruction causes the
02100 instruction before the motion instruction to be executed with the
02200 motion. This is only useful with OPEN if it is desired to open the
02300 hand as it moves off.
02400 i.e
02500 OPEN 3
02600 MERGE
02700 MOVE T
02800 will cause the hand to start opening as the arm starts to move.
02900
03000 TOUCH <mask>
03100 This causes the arm to stop during the next instruction if any of the
03200 masked touch sensors in <mask> are activated.
03300 i.e.
03400 TOUCH 3
03500 OPEN 0
03600 will cause the hand to close until it touches something. If it
03700 touches anything an error <mask>&6 is returned where <mask> are those
03800 sensors which have been activated.
03900
00100 SAVE <id>
00200 The current deviation in x,y and z from the set point is saved in
00300 cell <id>. for example if the hand were move to a position T and then
00400 CENTERed the deviation of position of the hand from T, after the
00500 centering operation can be saved in <id>
00600 i.e.
00700 MOVE T
00800 CENTER 1
00900 SAVE C1
01000 Note that this does not save any change in hand orientation.
01100
01200 SET <id> <vect>
01300 This will preload cell <id> with the deviation x,y,z in vector
01400 <vect>.
01500
01600 RESTORE <id> <int>
01700 This instruction must be executed immediately after a MOVE or GO
01800 instruction and will cause the hand to move to the position specified
01900 plus the deviation. SAVEd in cell <id>. If <int> is non zero the cell
02000 will be freed for further use.
02100 i.e.
02200 MOVE T
02300 RESTORE C1 1
02400 will cause the hand to move to T plus the vector SAVEd in C1. It will
02500 also free up C1 for further use.
02600
00100 JUMP <label>
00200 All instructions may be labelled by a label followed by a colon, and
00300 the JUMP instruction will cause control to jump to that instruction.
00400 i.e.
00500 L1: MOVE T
00600 PARK
00700 JUMP L1
00800 will cause an infinite loop.
00900
01000 SKIPE <error>
01100 If error <error> occurs during execution on the previous instruction
01200 then the following instruction is skipped.
01300 i.e.
01400 L1: OPEN 3
01500 CHANGE REACH 1 NIL 0 0
01600 CLOSE 1
01700 SKIPE 2
01800 JUMP L2
01900 JUMP L1
02000 L2:
02100 will cause the hand to advance by inches snapping its jaws until it
02200 finds something wider than 1 inch.
02300
02400 SKIPN <error>
02500 The same as SKIPE except that it skips only if the error did not
02600 occur. Which makes the last example cleaner.
02700 L1: OPEN 3
02800 CHANGE REACH 1 NIL 0 0
02900 CLOSE 1
03000 SKIPN 2
03100 JUMP L1
03200
03300 SKIPS <error>
03400 This is like SKIPE in that the right octal digit of the error must
03500 match exactly but it also requires that the logical AND of the high
03600 order digits with <error> is true. This is mostly used in touch work.
03700 For example if either error 46 or error 16 would indicate some state
03800 then a SKIPS 56 would detect it.
03900
04000 AOJ <label>
04100 This is the same as JUMP except that it will perform a spiral box
04200 search as follows. A SEARCH command must have first been executed to
04300 calculate the differential joint angle changes to make an x deviation
04400 and a y deviation at the place that the search must be executed. Then
04500 every time the AOJ instruction is executed it first performs a
04600 RESTORE of appropriate magnitude to generate the spiral and then
04700 performs the JUMP.
04800 i.e.
04900 MOVE T
05000 SEARCH 1
05100 L1: MOVE T
05200 AOJ L1
05300 Will cause a spiral search in one inch steps. The first move to T is
05400 important as the context for the SEARCH must be established.
05500
05600 SEARCH <step>
05700 Computes the change in joint angles to conduct a search, in the x,y
05800 plane, where the arm is currently planned to be and zeros the AOJ
05900 counters.
06000
06100 FLUSH
06200 Due to the partial paging scheme used by the arm, Jumps must occur
06300 within pages This instruction will cause a new page to be started.
06400 This will soon go away.
06500
00100 LINK <n>
00200 Will cause the transformation of link <n> ( 3 ≤ n ≤6) to be typed
00300 out.
00400
00500 GRASP
00600 Causes the current hand opening to be typed out.
00700
00800 WEIGHT
00900 Causes the uncompensated weight that the hand is believed to be
01000 holding, based on error torques, to be typed out.
01100
01200 I
01300 Causes the joint angles to be typed out.
00100 DEFINE <macro name> <par>
00200 <body>
00300 This defines a macro of name <macro name> and formal parameters given
00400 by <par> a list of identifiers. The body then follows,line by line.
00500 The macro is terminated by a blank line. macros may be nested. An
00600 example
00700 DEFINE GRAB MIN
00800 MOVE T
00900 CLOSE MIN
01000
01100 If the macro call appears then the expanded code will be assembled.
01200 GRAB 2
01300 will assemble as
01400 MOVE T
01500 CLOSE 2
01600 These macros are written out by the DUMP command and are read in by
01700 the REQUIRE command.
01800
01900 ED <macro name>
02000 This is a rudementary editor. The <macro name> must be given the
02100 first time but need not be gived again if the same macro is to be
02200 re-edited. The macro definition is then presented line by line every
02300 time a C/R is typed. Previous lines may be retrieved by typing ALT.
02400 A "D" will delete the current line
02500 An "I" will insert a line after the present line, to be typed
02600 in.
02700 An "R" will replace the current line with one to be typed in.
02800 A "T" will cause the next line to be typed.
02900 All these commands may be preceded by an unsigned integer which will
03000 do n of them. For example 5D will delete the current and next 4
03100 lines. When you have finished editing the macro type "E" then the
03200 macro will be read in again and redefined. (assuming that the first
03300 line which has the DEFINE is not deleted. This by the way is a good
03400 way to modify existing macros if the macro name is changed a new
03500 macro will be defined. One additional feature is "F" followed SOS
03600 manner by a string. It will then do a series of C/Rs until a line
03700 with a matching string is found.
00100 This is a programming example. We have the situation of the hand
00200 holding the screw driver which has a screw on its end. We want to
00300 insert the screw into a hole and to screw it all the way in.
00400 DEFINE SCRW H A ;The macro to screw the screw
00500 ;into hole H using approach A
00600 VECT SA ;The departure vector from
00700 ;the screw dispenser
00800 0 -1 2
00900 VECT SCK ;The radii of gyration of the
01000 ;screw driver
01100 .5 1.0 1.0
01200 CONO A SA SCK 10 40 50 ;Set up the conditions for
01300 ;the move
01400 FIND H H 1 ;A nested macro call to
01500 ;perform the search
01600 VECT FV ;The force to verify that it
01700 ;is in the hole
01800 0 0 -60
01900 STOP FV NIL ;Stop during the next motion
02000 CHANGE REACH .7 NIL 0 0 ;If the arm goes .7 inch then
02100 ;we are not
02200 ;in the hole and the arm will
02300 ;stop with error 23
02400 FREE 3 X Y Z ;X, Y and Z are vectors in
02500 ;the x, y and z directions.
02600 ;This will specify of
02700 ;freedom.
02800 VECT FV ;We will wnat to push down
02900 ;with this force
03000 0 0 -60
03100 FORCE FV NIL ;Push with force FV
03200 VECT MV ;This is the stopping moment
03300 0 0 -100
03400 STOP NIL MV ;Stop when we meet it.
03500 SCREW 60 ;Drive the screw driver at
03600 ;this velocity
03700 MERGE ;while
03800 CHANGE NIL 0 NIL 0 100 ;we go nowhere while pushing
03900 ;down, with three free
04000 ;joints, monitoring the
04100 ;torque.
04200 L1: FREE 2 X Y ;The screw is now in and we
04300 ;must pull the screw driver
04400 ;out. We want two
04500 WOBBLE .2 ;Shake things around a bit
04600 CHANGE REACH -.2 NIL 0 0 ;while we go up 0.2 inches
04700 VECT FV ;Set up a force
04800 0 0 100
04900 STOP FV NIL ;and stop if it is exceeded
05000 ;during the next motion,
05100 ;indicating that the driver
05200 ;is jammed in the screw.
05300 NNUL ;dont null errors
05400 CHANGE Z 1 NIL 0 50 ;and try to go up an inch.
05500 SKIPE 23 ;this means that the stopping
05600 ;force of 100 oz was not meet
05700 ;and all is O.K.
05800 JUMP L1 ;if not try again
05900 CONO SA A SCK 10 0 0 ;Set up the return conditions
06000 GO SC ;and go back to the dispenser
00100 DEFINE FIND T D F ;This macro is used to search
00200 ;for the hole The hole is at
00300 ;Trans T offset by a vector D
00400 ;scaled by F
00500 NNUL ;dont null the first time
00600 GO T D F NIL 0 ;Go to the hole position
00700 VECT FV ;Maximum resistance that the
00800 ;screw will meet
00900 0 0 -50
01000 SEARCH .07 ;Set up for a search of 0.7
01100 ;in steps. Note that the
01200 ;context for the search has
01300 ;been established by the
01400 ;previous GO.
01500 CONO NIL NIL SCK 10 0 0 ;No arrive or depart, move
01600 ;directly
01700 L1: GO T D F NIL 0 ;The search move
01800 STOP FV NIL ;Try to go down
01900 NNUL ;without nulling
02000 CHANGE REACH .6 NIL 0 60 ;by 0.6 inches
02100 SKIPE 23 ;if we meet resistance then
02200 ;not in hole
02300 AOJ L1 ;spiral and try again
02400
00100 ERRORS
00200 This is a list of the error messages you might get when running the arm.
00300 When running wave the error message corresponding to the error is typed.
00400
00500 1 Arithmetic Overflow occured. Something bad has happened.
00600 <n>1 Excessive force occured at joint <n>
00700 2 Hand closed more than minimum specified in CLOSE function
00800 3 File not found
00900 4 Someone has pawned the DSK
01000 5 Someone has sold the DSK
01100 <mask>6 Touch sensors <mask> have touched something
01200 7 Cannot read the joint positions, usually hardware trouble.
01300 20 Function took too long to execute
01400 22 Hand function took too long to execute.
01500 23 Arm failed to reach force limit set by STOP during motion.
01600 24 Arm in L1: JUMP L1 type loop.
01700 25 Save array number out of bound
01800 27 The function you have called is disconnected.
01900 30 The arm is down
02000 50 Librascope read error
02100 60 You have a very old program which does not match the current servo
02200 70 The reference supply used by the arm is off.
02300 100 The PDP6 is not running.
02400 200 The servo program has been interrupted.
02500
02600
00100 RUNNING THE ARM
00200 Power to the arm is controlled by a switch on a box with two lights.
00300 The box is located on the rack under the table near the base of the
00400 arm. The yellow light indicated that the power supply is on and the
00500 red light indicated that the arm is also on.
00600
00700 There is also a grey box on the end of a cable with some switches and
00800 a →→→"RED BUTTON"←←← on it. The buttons are brake releases. The one
00900 furthest from the →→→"RED BUTTON"←←← is joint 1. There is no brake
01000 release for joint 6, sorry about that. The last switch is the hand
01100 brake release. All brakes should be turned on when the arm is being
01200 run.
01300
01400 Now for the →→→"RED BUTTON"←←←. If the →→→"RED BUTTON"←←← is pushed
01500 while the arm is running the arm will stop and all brakes will be
01600 applied. You should always be holding the box with your finger over
01700 the →→→"RED BUTTON"←←← when running the arm. For damaging the hand
01800 ... -6 acamedic credits. For damaging the arm ... -12 acamedic
01900 credits.
02000
02100 There is also a bell that starts 1 second before the arm does in the
02200 case of a DO and starts with the arm in the case of a P. The bell
02300 goes "ting, ting, ting," just like a truck backing-up, except that
02400 someone stole the bell, oh well!
02500
02600 RUNNING THE PROGRAM
02700 The program is on 1,3 and is run by typing
02800 R WAVE
02900 This program will in turn log in a servo program as a PTY job, and
03000 will run a job called [ARM]. When this job is running you will be
03100 asked if you want your files saved. If you respond Y then the arm
03200 programs will be written out on the 3330 with .TRJ extensions. These
03300 files may be executed at a later time by simply saying DO followed by
03400 the file name(with no extension). If you do not ask to have your
03500 files saved fast bands will be used which although fast will all
03600 disappear when you kill your job.
03700
03800 Wave will then announce that it is ready and you can type anything on
03900 the previous pages. It will respond with O.K. when it has been
04000 supplied all the parameters for the function you are defining. It
04100 will then respond with an * when ready for the next function.
04200 Sometimes in execution the servo program will cause trouble. If it is
04300 in the run queue but not in spacewar mode then someone has the A/D
04400 assigned If it is in the stop queue then you will have to ↑c wave and
04500 restart, which will lose all your macros and data unless you have
04600 dumped it.
04700